#![no_std]
#![no_main]

/// 需要提供几个系统调用的符号
/// 具体说明参见 : 可以百度 __libc_csu_init __libc_csu_fini
/// 例子:  https://www.cnblogs.com/sky-heaven/p/8422023.html
///
#[no_mangle]
pub extern "C" fn __libc_csu_init() -> () {}

#[no_mangle]
pub extern "C" fn __libc_csu_fini() -> () {}

#[no_mangle]
pub extern "C" fn __libc_start_main() -> ()
{
    // 实现自己的main 方法
    main();
    // 程序结束
    exit(0);
}

/// 声明 符号
/// 类似与C 的 导入头文件
/// 程序会去找这些符号是否被实现
extern "C" {
    fn sys_exit(code : usize) -> ! ;
    fn sys_write(fd: usize , bytes : *const u8 , len : usize ) -> isize ;
}

fn exit(code : i8) -> ! {
    unsafe {
        sys_exit(code as usize )
    }
}

/// 实现自己的打印功能
/// println! 宏 使用的是 std 的
fn my_print(s: &str) {
    let bytes = s.as_bytes();
    unsafe {
        sys_write(1 , bytes.as_ptr() , bytes.len());
    }
}


/// 实现自己的panic信息的打印
#[panic_handler]
fn my_panic(_info : &core::panic::PanicInfo) ->! {
    my_print("##PANIC##\n");
    exit(-1);
}


#[no_mangle]
fn main(){
    my_print("test my_print");
}


